/*
 * @Description:Server
 * 
 * @Author: rendc
 * 
 * @Date: 2025-03-19 10:26:42
 * 
 * @LastEditors: rendc
 * 
 * @LastEditTime: 2025-03-19 11:17:17
 */

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;

public class Server {
  // 搭建TCP服务器，端口8002
  // a.接收客户端发送的所有老师对象，遍历输出，并将老师信息全部写入
  // 本地文件 src/t.txt
  // b.写入完成后，返回给客户端一个信息: "ok"
  // c.最后关闭服务器
  @SuppressWarnings("unchecked")
  public static void main(String[] args) throws Exception {
    // 1. 搭建Tcp服务器
    int port = 8002; // 指定服务器启动的端口
    ServerSocket server = new ServerSocket(port); // 创建服务器对象
    System.out.println("服务器：已启动，端口" + port);
    // 2. 接收客户端的连接
    Socket client = server.accept();
    System.out.println("服务器：客户端连接成功");
    // 获取IO流
    InputStream is = client.getInputStream();
    OutputStream os = client.getOutputStream();
    // 增强流 将输入流封装成对象流
    ObjectInputStream ois = new ObjectInputStream(is);
    // 接收客户端发送的所有老师对象
    List<Teacher> list = (List<Teacher>) ois.readObject(); // 注意这里的类型转换不安全
    // 遍历输出
    for (Teacher teacher : list) {
      System.out.println("服务器：遍历输出" + teacher);
    }
    // 并将老师信息全部写入本地文件 src/t.txt
    // 输出流
    // 代码层面判断t.txt是否存在 不存在的话要去创建一个 存在的话提示用户覆盖
    FileOutputStream fos = new FileOutputStream("src/t.txt");
    // 封装成对象流
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    // 写入文件
    oos.writeObject(list);
    System.out.println("服务器：成功写入文件");
    // 写入完成后，返回给客户端一个信息: "ok"
    // 获取输出流 - 增强流
    OutputStreamWriter osw = new OutputStreamWriter(os);
    BufferedWriter bw = new BufferedWriter(osw);
    bw.write("ok");
    System.out.println("服务器：给客户端返回响应信息");
    // 关闭服务器 关闭资源
    System.out.println("服务器：即将关闭");
    bw.close();
    osw.close();
    oos.close();
    fos.close();
    ois.close();
    os.close();
    is.close();
    client.close();
    server.close();
  }
}
